Keil 您所在的位置:网站首页 keil 汇编文件 Keil

Keil

2024-05-23 01:18| 来源: 网络整理| 查看: 265

一、问题现象

在使用正点原子 STM32 开发板例程时,原子的sys.c和sys.h文件中使用了一些内嵌汇编函数。当使用 armcc V6 进行编译的时候会报错,如下图所示:

二、原因分析

内联汇编 首先要明白什么是内联汇编,所谓内联汇编即使用__asm("指令");这种语法结构的 C 语句。而在 mdk 下,内联汇编仅支持 ARM 汇编语言,不支持 Thumb 或者 Thumb-2 汇编语言,但内嵌汇编器支持 Thumb 和 Thumb-2 汇编指令,STM32 的 core cortex-M3是 Thumb-2指令,所以采用内嵌汇编的方式进行汇编调用。 在 armcc V5 的版本中,如下形式的内嵌汇编函数能够通过编译:

__asm void xxx()

{

nop

BX lr

}

但在 armcc V6 的版本中,需要将形式修改为:

void xxx(xx)

{

__ASM volatile("xxx");

}

三、解决方案

对内联汇编函数进行重新编写: 修改前:

__asm void WFI_SET(void)

{

WFI;

}

修改后:

void WFI_SET(void)

{

__ASM volatile("WFI");

}

如下图所示,修改后的内联函数不再报错且通过编译

本文主要叙述如何搭建并配置Keil嵌入式开发环境,并在此基础上完成基于STM32汇编程序的编写,以及对hex文件的简单分析。

目录

一、环境搭建1、MDK是什么2、软件下载(1)官网下载(2)百度网盘下载

3、MDK(Keil)软件安装4、安装芯片支持包5、注册

二、STM32汇编程序1、新建工程2、选择设备3、选择运行环境4、添加源文件5、编写汇编程序6、设置仿真器7、编译程序8、调试

三、Hex文件分析1、什么是Hex文件2、Hex文件内容分析

四、总结

一、环境搭建

1、MDK是什么

MDK 源自德国的 KEIL 公司,是 RealView MDK 的简称,在全球 MDK 已经有超过 10 万的嵌入式开发工程师使用。Keil MDK 是基于 Arm 的微控制器最全面的软件开发解决方案,包括创建、构建和调试嵌入式应用程序所需的所有组件。

2、软件下载

首先需要下载安装 MDK5 软件和 STM32 包,STM32包中附带配置MDK所需要的芯片支持包。 下面提供两种选择:

(1)官网下载

官网下载比较慢,可以使用 Edge 的多线程下载功能来提高下载速度,打开方式如下: 首先在edge的地址栏输入 edge://flags/ ,然后在搜索框中输入 Parallel downloading,在其后面的选项中选择 Enabled,接着重启 Edge 即可

MDK-ARM: 下载地址: https://www.keil.com/download/product/

依次点击 “MDK-Arm”->“MDK537.EXE” ,下载 MDK537.exe 注意下载正确版本,选择 MDK-Arm

芯片支持包: 在上面的操作结束后,在当前页面点击 Device List 进入如下页面,滑动滚轮向下翻页,直到找到 STMicroelectronics ,点进去 选择 STM32F1 Series,点击 STM32F103,选择 STM32F103ZE 点击右下角的 Download,下载芯片支持包

(2)百度网盘下载

网盘链接:https://pan.baidu.com/s/1HnfzWk4CYgGr_rSfuM-Gyw 提取码:plt3 网盘里面的文件和官网上面的一样,我打包在一起的 因为官网上面的是上面提供的MDK软件是试用版本,只能编译32K程序,超过32K程序需要注册,未注册软件编译程序会提示错误信息。学生工程师学习研究用途需要使用MDK,可以使用文件夹内的注册工具生成注册码

3、MDK(Keil)软件安装

(1)双击打开 MDK537.EXE 应用程序文件,点击 Next>>

(2)勾选 I agree… 后,点击 Next>>

(3)选择安装路径,并点击 Next>>

(4)随意输入 Name 和 E-mail,再点击 Next>>

(5)等待安装完成,点击 Finish

(6)浏览器会自动打开网页,弹出以下信息,点击 OK 后,鼠标会变成转圈圈的,因为正在进行在线安装各种 pack 支持包 ,但会安装失败,不用着急,右上角关掉窗口,下面开始手动安装 pack 支持包

4、安装芯片支持包

(1)双击打开 Keil.STM32F1xx_DFP.2.4.0.pack 支持包,出现安装界面后点击 Next>> ,开始安装

(2)需要等待一会

(3)点击 Finish,完成安装

5、注册

(1)点击运行注册器程序

(2)在桌面找到 Keil uVision5 软件图标,点击 鼠标右键 ,以管理员身份运行

(3)点击 File–>Lincense Management–>Single-User Lincense ,找到 CID,复制 CID 中的内容填写到注册器的 CID 空白处,将注册器中 Target 选择为 ARM ,点击 Generate ,得到注册码

(4)将生成的注册码复制粘贴到 Keil 的 New Lincense ID Code 空白处,点击 Add LIC

(5)添加成功后,可以看到如下信息,点击Close就完成注册了

至此MDK5安装完成!

二、STM32汇编程序

1、新建工程

(1)打开 Keil,选择 Project ,点击 New μVision Project…

(2)选择文件保存的路径以及文件的名称,点击 保存

2、选择设备

在弹窗中选择相应的目标环境,此处我选的是 STM32F103ZE

3、选择运行环境

ARM 的 CMSIS 已经把开发所需要的软件组件都封装好了,因此直接选择即可; (1)CMSIS下选择 CORE (2)Device下选择 Startup,其中包含了启动文件

4、添加源文件

(1)右击 Source Group 1 ,点击 Add New Item to Group ‘Source Group 1’…

(2)点击 Asm Files (.s) 添加汇编文件,然后输入文件名 test,并点击 Add

5、编写汇编程序

AREA MYDATA, DATA

AREA MYCODE, CODE

ENTRY

EXPORT __main

__main

MOV R0, #10

MOV R1, #11

MOV R2, #12

MOV R3, #13

;LDR R0, =func01

BL func01

;LDR R1, =func02

BL func02

BL func03

LDR LR, =func01

LDR PC, =func03

B .

func01

MOV R5, #05

BX LR

func02

MOV R6, #06

BX LR

func03

MOV R7, #07

MOV R8, #08

BX LR

6、设置仿真器

(1)点击 魔法棒 ,点击 Debug,设置仿真器为 Use Simulator 设置下面的 Dialog DLL 项为:DARMSTM.DLL 和 TARMSTM.DLL Parameter 项为:-pSTM32F103ZE

或者通过右键 Target 1,选择 Options for Target ‘Target 1’…,进入设置 (2)在 Output 下勾选 Create Hex File ,这样就可以生成 hex 文件了

7、编译程序

点击 Build 或者 Rebuild 没有报错,编译成功,并且生成了 hex 文件

8、调试

点击 1 处的按钮进入调试,多次点击 2(Step Over),直到调试结束,此时可以看到寄存器 R5,R6,R7,R8 与程序设置一致 若看不到调试结果,可以点击一次 Stop

三、Hex文件分析

1、什么是Hex文件

它是由一行行符合 Intel HEX 文件格式的文本所构成的ASCII 文本文件。每一行包含一 个 HEX 记录 ,由对应机器语言码和/或常量数据的十六进制编码数字组成。Hex文件通常用于传输将被存于ROM 或者EPROM 中的程序和数 据。大多数EPROM 编程器或模拟器使用Intel HEX 文件。Hex文件是可以烧写到单片机中,被单片机执行的一种文件格式,生成Hex文件的方式由很多种,可以通过不同的编译器将C程序或者汇编程序编译生成hex。

2、Hex文件内容分析

(1)从编译的 Output 可看出最终生成的 hex 文件各部分的大小 (2)用记事本打开 hex 文件,发现其是一连串的十六进制数 (3)扩展线性地址记录 hex 文件的第一排字符称之为 扩展线性地址记录,也称为 32位地址记录 或 HEX386记录 。 在第一行数据 020000040800F2 中,其实际表达为0x02 0x00 0x00 0x04 0x08 0x00 0xf2。具体含义为:

第一个字节 0x02表示本行数据的长度; 第二、三字节 0x00 0x00表示本行数据的起始地址; 第四字节 0x04表示数据类型; 0x08 0x00是数据; 最后一个字节 0xf2为校验和,计算方法是01h+NOT(02h+00h+04h+08h+00h)

其中第四字节的数据类型有:0x00、0x01、0x02、0x03、0x04、0x05,分别有以下含义

数据类型作用0x00用来记录数据,HEX文件的大部分记录都是数据记录0x01用来标识文件结束,放在文件的最后,标识HEX文件的结尾0x02用来标识扩展段地址的记录0x03开始段地址记录0x04用来标识扩展线性地址的记录0x05开始线性地址记录

(4)hex文件的数据格式

Intel HEX 由任意数量的十六进制记录组成。每个记录包含5个域,每一组字母 对应一个不同的域,每一个字母对应一个十六进制编码的数字。每一个域由至少两个十六进制编码数字组成,它们构成一个字节。

字节作用:(冒号)每个Intel HEX 记录都由冒号开头LL数据长度域, 代表记录当中数据字节 (D…D) 的数量aaaa地址域, 代表记录当中数据的起始地址TT代表HEX 记录类型的域D…D数据域,代表一个字节的数据CC校验和域,表示这个记录的校验和

记录格式可表示为::[1字节长度][2字节地址][1字节记录类型][n字节数据段][1字节校验和]

一个记录可以有许多数据字节。记录当中数据字节的数量必须和数据长度域(LL)中指定的数字相符 校验和的计算是通过将记录当中所有十六进制编码数字对的值相加,以256为模进行以下补足

对照第一行的扩展线性地址记录 :020000040800F2 中,可以看做是 0x02 0x00 0x00 0x04 0x08 0x00 0xf2 第一个 0×02 表示该行数据中有两个数据 第二个,第三个 0x00 0x00 表示本行数据的起始地址位 第四个字节 0x04 表示扩展线性地址记录,对应上述的 TT 域 第五个、第六个 0x08 0x00 表示数据字节,与 数据长度域(LL) 中对应,即第一个 0x02 最后一个字节 0xf2 为校验和。校验和= 0x100 - 累加和

(5)文件尾 在文件的最后一排,是一个文件的结束标志::00000001FF

内容描述00记录的长度为 00000LOAD OFFSET为000001TYPE = 01FF校验和为FF

四、总结

通过本次练习,我能够更加熟练的搭建并配置 Keil 嵌入式开发环境,初步掌握了 Keil 的使用方法,并在此基础上完成了基于 STM32 汇编程序的编写,并且实现了汇编程序的编译和调试。通过查阅资料了解了hex文件的内容和数据格式。但是由于没有学过汇编语言,实现过程也遇到了很大的阻碍,希望可以通过后面的学习来完善相关知识的储备。

参考列表: 1.https://blog.csdn.net/qq_45659777/article/details/120496577 2.https://blog.csdn.net/qq_43279579/article/details/108880667?utm_source=app 3.https://blog.csdn.net/ssj925319/article/details/108919862 4.https://blog.csdn.net/u010632165/article/details/106481146 5.https://blog.csdn.net/ssj925319/article/details/111868500 6.https://blog.csdn.net/xwmrqqq/article/details/111824539 7.https://blog.csdn.net/qq_43279579/article/details/111717607

1. C语言中直接嵌入汇编程序段

1、在 C 文件中要嵌入汇编代码片以如下方式加入汇编代码:

#pragma ASM

; Assembler Code Here

#pragma ENDASM

2、在 Project 窗口中包含汇编代码的 C 文件上右键,选择“Options for ...”,点击右边的“Generate Assembler SRC File”和

“Assemble SRC File”,使检查框由灰色变成黑色(有效)状态;

3、根据选择的编译模式,把相应的库文件(如 Small 模式时,是 Keil\C51\Lib\C51S.Lib)加入工程中, 该文件必须作为工程的最后文件;

4、这点也是本人要重要说明的!即一定要将c:\keil\C51下的STARTUP.A51文件加入项目

4、编译,即可生成目标代码。

来个实例吧:

#i nclude

void main(void)

{

P2=1;

#pragma asm

MOV R7,#10

DEL:MOV R6,#20

DJNZ R6,$

DJNZ R7,DEL

#pragma endasm

P2=0;

}

2 . 无参数传递的函数调用

C51调用汇编函数

1.无参数传递的函数调用

先来个例子:其中example.c和example.a51为项目中的两个文件

***********************example.c***************



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有